//类的基本使用
export {}; //使用模块,确保跟其它示例没有成员冲突
class Person {
  //使用先需要先声明
  //必须赋值,在下面或者在构造函数中,否则会报错
  public name: string; //共有的
  private age: number; //私有的
  protected gentor: boolean; //受保护得到
  constructor(name: string, age: number, gentor: boolean) {
    this.name = name;
    this.age = age;
    this.gentor = gentor;
  }
  sayHi(msg: string): void {
    console.log(`${this.name}`);
    console.log(this.age);
  }
}

//类的访问修饰符  添加private修饰符的成员只能在类中被访问,外部不能
const tom = new Person("tom", 18, true);
console.log(tom.name);
//console.log(tom.age); //属性“age”为私有属性，只能在类“Person”中访问。

//类的修饰符  添加public修饰符代表共有成员---不加修饰符默认就是public

//类的修饰符  添加protected修饰符代表受保护的成员

//console.log(tom.gentor); //属性“gentor”受保护，只能在类“Person”及其子类中访问

//private  和 protected  的区别  第一个不能在子类中访问,第二个可以在子类中访问
class Student extends Person {
  //如果这个构造函数添加一个私有属性,在外面这个类就不能被创建,需要新建一个静态属性创建
  private constructor(name: string, age: number, gentor: boolean) {
    //   super调用父类的构造函数
    super(name, age, gentor);
    console.log(this.gentor); //在子类可以访问父类受保护的属性
  }
  //因为Student的构造函数是私有的,所以新建一个静态方法
  static create(name: string, age: number, gentor: boolean) {
    return new Student(name, age, gentor);
  }
}

//const jack = new Student("tom,", 18, true); //类“Student”的构造函数是私有的，仅可在类声明中访问。
const jack2 = Student.create("tom", 18, true);

//可读属性---readonly
class Person1 {
  //使用先需要先声明
  //必须赋值,在下面或者在构造函数中,否则会报错
  //可读属性,如果存在修饰符,可读属性必须写在修饰符后面,一但赋值就不能在修改
  public name: string; //共有的
  private age: number; //私有的
  protected readonly gentor: boolean; //protected-受保护得的  readonly只读
  constructor(name: string, age: number, gentor: boolean) {
    this.name = name;
    this.age = age;
    this.gentor = gentor;
  }
  sayHi(msg: string): void {
    console.log(`${this.name}`);
    console.log(this.age);
  }
}
const tom1 = new Person1("tom1", 18, true);
//tom1.gentor = false; //属性“gentor”受保护，只能在类“Person1”及其子类中访问。ts(2445)
//无法分配到 "gentor" ，因为它是只读属性。
